package com.example.api.service;

import com.example.api.dto.LoginResponseDTO;
import com.example.api.entity.Users;
import com.example.api.repository.UserRepository;
import com.example.api.utils.JwtUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private JwtUtil jwtUtil;

    @Autowired
    private BCryptPasswordEncoder passwordEncoder;

    /**
     * 用户登录方法
     * @param account 用户名或邮箱
     * @param password 密码
     * @return 登录响应数据传输对象
     */
    public LoginResponseDTO loginUser(String account, String password) {
        // 支持用户名或邮箱登录
        Users user = userRepository.findByUsername(account);
        if (user == null) {
            user = userRepository.findByEmail(account);
            if (user == null) {
                throw new RuntimeException("用户不存在");
            }
        }

        // 验证密码
        if (!passwordEncoder.matches(password, user.getPassword())) {
            throw new RuntimeException("密码错误");
        }

        // 更新最后登录时间
        user.setLastLogin(LocalDateTime.now());
        userRepository.save(user);

        // 生成JWT token
        String token = jwtUtil.generateToken(user.getUserId(), user.getUsername());

        return LoginResponseDTO.builder()
                .userId(user.getUserId())
                .username(user.getUsername())
                .email(user.getEmail())
                .token(token)
                .message("登录成功")
                .build();
    }

    /**
     * 管理员登录方法
     * @param account 用户名或邮箱
     * @param password 密码
     * @return 登录响应数据传输对象
     */
    public LoginResponseDTO loginAdmin(String account, String password) {
        Users user = userRepository.findByUsername(account);
        if (user == null) {
            user = userRepository.findByEmail(account);
            if (user == null) {
                throw new RuntimeException("管理员不存在");
            }
        }

        // 验证密码
        if (!passwordEncoder.matches(password, user.getPassword())) {
            throw new RuntimeException("密码错误");
        }

        // 检查是否为管理员角色
        if (!"2".equals(user.getRole())) {
            throw new RuntimeException("没有管理员权限");
        }

        // 更新最后登录时间
        user.setLastLogin(LocalDateTime.now());
        userRepository.save(user);

        // 生成JWT token
        String token = jwtUtil.generateToken(user.getUserId(), user.getUsername());

        return LoginResponseDTO.builder()
                .userId(user.getUserId())
                .username(user.getUsername())
                .email(user.getEmail())
                .token(token)
                .message("管理员登录成功")
                .build();
    }

    /**
     * 用户注册方法
     * @param username 用户名
     * @param password 密码
     * @param email 邮箱
     * @return 用户实体
     */
    public Users registerUser(String username, String password, String email) {
        if (userRepository.findByUsername(username) != null) {
            throw new RuntimeException("用户名已存在");
        }

        Users user = new Users();
        user.setUsername(username);
        user.setPassword(passwordEncoder.encode(password));
        user.setEmail(email);
        user.setRegistrationDate(LocalDateTime.now());

        return userRepository.save(user);
    }

    /**
     * 获取所有用户信息
     * @return 用户列表
     */
    public List<Users> getAllUsers() {
        return userRepository.findAll();
    }
//搜索用户
    public List<Users> searchUsers(String keyword) {
        return userRepository.searchByUsernameOrEmail(keyword);
    }

    //删除用户
    public void deleteUser(int userId) {
        userRepository.deleteById(userId);
    }

    //修改用户信息
    public Users updateUser(int userId, Users updatedUser) {
        Users existingUser = userRepository.findById(userId)
                .orElseThrow(() -> new RuntimeException("用户不存在"));

        // 更新用户信息
        existingUser.setUsername(updatedUser.getUsername());
        existingUser.setEmail(updatedUser.getEmail());
        // 根据需要更新其他字段
        existingUser.setRole(updatedUser.getRole());
        return userRepository.save(existingUser);
    }

}
